/*
 * Band.java
 *
 * Created on 12 de Março de 2003, 22:40
 */
package saci.reptil;

import java.util.Vector;
import saci.reptil.event.BandEvent;
import saci.reptil.event.BandListener;

/**
 * Classe abstrata representando as Bandas do relat�rio
 *
 * @author  saci
 */
public abstract class Band extends ReportPanel implements BandEvent {

    private Vector listeners = new Vector();
    private int page;
    private ReportData reportData;

    /**
     * Adiciona um <i>listener</i> � banda
     *
     * @param listener o <i>listener</i> a ser adicionado
     * @see br.inf.saci.report.event.BandListener
     */
    public void addBandListener(BandListener listener) {
        listeners.addElement(listener);
    }

    /**
     * Remove um <i>listener</i> da banda
     *
     * @param listener o <i>listener</i> a ser removido
     * @see br.inf.saci.report.event.BandListener
     */
    public void removeBandListener(BandListener listener) {
        listeners.removeElement(listener);
    }

    /**
     * Retorna o numero da p�gina sendo impressa
     */
    public int getPageNumber() {
        return page;
    }

    /**
     * Prepara a Banda para impress�o ou visualiza��o
     *
     * @param page a p�gina sendo impressa
     * @param parameters os parametros que ser�o passadas para as subclasses
     */
    public void prepareAll(int page, Object[] parameters) {
        this.page = page;
        this.reportData = (ReportData) parameters[1];

        prepare(parameters);
        prepareFunctions(page, ((ReportManager) parameters[2]).getNumberOfPages(), ((Integer) parameters[0]).intValue());

        for (int i = 0; i < listeners.size(); i++) {
            ((BandListener) listeners.get(i)).bandAction(this);
        }
    }

    /**
     * Prepara a banda (Implementado pela sub-classe)
     *
     * @param parameters os parametros para a subclasse (ReportManager, N�mero total de paginas)
     */
    public abstract void prepare(Object[] parameters);

    /**
     * Retorna esta mesma banda
     */
    public Band getSource() {
        return this;
    }

    /**
     * Retorna a fonte de dados do relat�rio.
     * <p>
     * S� dispon�vel depois de preparado (prepareAll())
     */
    public ReportData getData() {
        return reportData;
    }
}
